package main

import (
	"fmt"
	"time"
)

//func main() {
//	// 添加waitgroup 让主协程可以变成守护协程
//	wg := sync.WaitGroup{}
//	wg.Add(1)
//
//	// 创建一个channel通道
//	ch := make(chan string)
//	fmt.Println("变量通道内存地址：",&ch)
//
//	// 开启一个监控狗
//	go func() {
//		defer wg.Done()
//		watchDog2(ch)
//	}()
//	// 先让监控狗运行5s
//	time.Sleep(5*time.Second)
//	// 发出终止指令
//	fmt.Println("发出终止指令")
//	ch <- "stop..."
//	wg.Wait()
//}

func watchDog2(ch chan string) { // ch <-chan string 这里也可以这样定义参数，让通道只能接收
	fmt.Println("参数通道内存地址：", &ch)
	for {
		select {
		case <-ch:
			fmt.Println("收到终止指令，终止这个协程")
			return
		default:
			fmt.Println("监控狗：正在监控...")
		}
		time.Sleep(time.Second)
	}
}

/**
这个示例是使用 select+channel 的方式改造的 watchDog 函数，实现了通过 channel 发送指令让监控狗停止，进而达到协程退出的目的。以上示例主要有两处修改，具体如下：
为 watchDog 函数增加 stopCh 参数，用于接收停止指令；
在 main 函数中，声明用于停止的 stopCh，传递给 watchDog 函数，然后通过 stopCh<-true 发送停止指令让协程退出。
*/
